{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "8e57b6e7-c75e-464d-847a-18f470f679dd",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.chains import ConversationChain\n",
    "from langchain_openai import ChatOpenAI\n",
    "from langchain.memory import (ConversationBufferMemory, ConversationBufferWindowMemory, \n",
    "ConversationSummaryMemory, ConversationSummaryBufferMemory, ConversationTokenBufferMemory)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "90038aba-78f9-4fa7-beec-9b56824cae61",
   "metadata": {},
   "outputs": [],
   "source": [
    "model = ChatOpenAI(model=\"gpt-3.5-turbo\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ee5f3885-49cf-42b9-953f-bc29cca12013",
   "metadata": {},
   "source": [
    "## ConversationBufferMemory"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "375b0da7-aea1-4799-b77b-c921177e08ad",
   "metadata": {},
   "outputs": [],
   "source": [
    "memory = ConversationBufferMemory(return_messages=True)\n",
    "chain = ConversationChain(llm=model, memory=memory)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "93a9fefa-9b29-49fe-b2e7-605873d4c7d1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input': '你好，我的名字是粒粒',\n",
       " 'history': [HumanMessage(content='你好，我的名字是粒粒'),\n",
       "  AIMessage(content='  你好，粒粒！我是您的人工智能助手。很高兴认识您。您有什么问题或需要帮助吗？我会尽力回答您的问题。')],\n",
       " 'response': '  你好，粒粒！我是您的人工智能助手。很高兴认识您。您有什么问题或需要帮助吗？我会尽力回答您的问题。'}"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\":\"你好，我的名字是粒粒\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "404e4276-c957-4caa-a372-dd4623ef12b5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input': '我的名字是什么？',\n",
       " 'history': [HumanMessage(content='你好，我的名字是粒粒'),\n",
       "  AIMessage(content='  你好，粒粒！我是您的人工智能助手。很高兴认识您。您有什么问题或需要帮助吗？我会尽力回答您的问题。'),\n",
       "  HumanMessage(content='我的名字是什么？'),\n",
       "  AIMessage(content='您的名字是粒粒。您刚刚告诉我您的名字是粒粒。您需要我帮您记住吗？')],\n",
       " 'response': '您的名字是粒粒。您刚刚告诉我您的名字是粒粒。您需要我帮您记住吗？'}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\":\"我的名字是什么？\"})"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6ddeac03-1f07-4ff7-8411-90bd834139d1",
   "metadata": {},
   "source": [
    "## ConversationBufferWindowMemory"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "207e03b9-ffee-4a70-8f36-dca15804d8a3",
   "metadata": {},
   "outputs": [],
   "source": [
    "memory = ConversationBufferWindowMemory(k=1, return_messages=True)\n",
    "chain = ConversationChain(llm=model, memory=memory)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "aa01d34c-a293-425e-90bd-1b03179c2c87",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input': '你好，我的名字是粒粒',\n",
       " 'history': [],\n",
       " 'response': ' 你好，粒粒！很高兴认识你。我是一个基于人工智能的对话系统，可以回答你的问题和提供信息。有什么我可以帮助你的吗？'}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\":\"你好，我的名字是粒粒\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "14a9f1c4-da0c-4357-9f01-ba074a187225",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input': '我是一个程序员',\n",
       " 'history': [HumanMessage(content='你好，我的名字是粒粒'),\n",
       "  AIMessage(content=' 你好，粒粒！很高兴认识你。我是一个基于人工智能的对话系统，可以回答你的问题和提供信息。有什么我可以帮助你的吗？')],\n",
       " 'response': '哇，程序员是一个很酷的职业！作为程序员，你可能会对编程语言、算法和软件开发感兴趣。如果你有任何关于编程或其他技术方面的问题，我会尽力帮助你解答的哦！有什么具体的问题想要问我吗？'}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\":\"我是一个程序员\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4bdb841f-091e-4fc2-87fb-a63289219246",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input': '我的名字是什么？',\n",
       " 'history': [HumanMessage(content='我是一个程序员'),\n",
       "  AIMessage(content='哇，程序员是一个很酷的职业！作为程序员，你可能会对编程语言、算法和软件开发感兴趣。如果你有任何关于编程或其他技术方面的问题，我会尽力帮助你解答的哦！有什么具体的问题想要问我吗？')],\n",
       " 'response': '很抱歉，我无法知道您的名字，因为我只是一个程序，没有能力获取您的个人信息。请问还有其他问题我可以帮助您解答吗？'}"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\":\"我的名字是什么？\"})"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1ee4d11c-bf2e-463f-8904-f91d4e74e951",
   "metadata": {},
   "source": [
    "## ConversationSummaryMemory"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "41fa4a3e-2b7e-4fe1-9fe2-3c185dc82962",
   "metadata": {},
   "outputs": [],
   "source": [
    "memory = ConversationSummaryMemory(return_messages=True, llm=model)\n",
    "chain = ConversationChain(llm=model, memory=memory)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "f068f005-5d38-4fb2-9157-d8a519f712a2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input': '你好，我的名字是粒粒',\n",
       " 'history': [SystemMessage(content='')],\n",
       " 'response': '  你好，粒粒！很高兴认识你。我是一个人工智能助手，可以回答你任何问题。有什么可以帮助你的吗？'}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\":\"你好，我的名字是粒粒\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "179d2656-bff4-4f11-971d-654e27789281",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input': '我是一个程序员，你呢？',\n",
       " 'history': [SystemMessage(content='The human introduces themselves as 粒粒 and the AI responds warmly, introducing itself as an artificial intelligence assistant ready to answer any questions. The human is welcome to ask for help with anything.')],\n",
       " 'response': '我是一个人工智能助手，专门设计来帮助回答各种问题和提供帮助的。有什么问题我可以帮你解决吗？'}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\":\"我是一个程序员，你呢？\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "e7eab038-6d28-4b74-8abd-30fffdc3e552",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input': '我的名字是什么？',\n",
       " 'history': [SystemMessage(content='The human introduces themselves as 粒粒 and the AI responds warmly, introducing itself as an artificial intelligence assistant ready to answer any questions. The human is welcome to ask for help with anything. The human reveals they are a programmer and the AI reiterates that it is an artificial intelligence assistant designed to help answer questions and provide assistance. The AI asks if there are any questions it can help with.')],\n",
       " 'response': '您好，粒粒！您的名字是粒粒。有什么我可以帮助您的吗？'}"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\":\"我的名字是什么？\"})"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f7d5299c-f24b-4247-875c-02ffd2053bf5",
   "metadata": {},
   "source": [
    "## ConversationSummaryBufferMemory"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "66ae2485-d1a3-4768-aee0-c6ee7c339976",
   "metadata": {},
   "outputs": [],
   "source": [
    "memory = ConversationSummaryBufferMemory(llm=model, max_token_limit=100, return_messages=True)\n",
    "chain = ConversationChain(llm=model, memory=memory)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "de7f836e-dcdb-4535-9c5a-cb1c3ea527b5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input': '你好，我的名字是粒粒',\n",
       " 'history': [HumanMessage(content='你好，我的名字是粒粒'),\n",
       "  AIMessage(content='你好，粒粒！很高兴认识你。我是一个人工智能程序，可以回答你的问题或者和你聊天。有什么我可以帮助你的吗？')],\n",
       " 'response': '你好，粒粒！很高兴认识你。我是一个人工智能程序，可以回答你的问题或者和你聊天。有什么我可以帮助你的吗？'}"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\":\"你好，我的名字是粒粒\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "3351ee34-f466-4737-bd55-9293cf6826ec",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input': '我是一个程序员，你呢？',\n",
       " 'history': [HumanMessage(content='我是一个程序员，你呢？'),\n",
       "  AIMessage(content='我是一个人工智能程序，专门设计来与人类交流和提供帮助的。我可以回答各种问题，从日常生活到技术问题都可以。有什么想问我的吗？')],\n",
       " 'response': '我是一个人工智能程序，专门设计来与人类交流和提供帮助的。我可以回答各种问题，从日常生活到技术问题都可以。有什么想问我的吗？'}"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\":\"我是一个程序员，你呢？\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "8c718af1-6231-4492-9deb-1ab539849c54",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input': '我的名字是什么？我前面说过的',\n",
       " 'history': [SystemMessage(content='The human introduces themselves as 粒粒 and the AI greets them in return. The AI explains that it is an artificial intelligence program that can answer questions or chat with them. It asks if there is anything it can help with.'),\n",
       "  HumanMessage(content='我是一个程序员，你呢？'),\n",
       "  AIMessage(content='我是一个人工智能程序，专门设计来与人类交流和提供帮助的。我可以回答各种问题，从日常生活到技术问题都可以。有什么想问我的吗？')],\n",
       " 'response': '您前面自我介绍时说您的名字是粒粒。您是一位程序员，对吗？您有什么需要我的帮助吗？'}"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\":\"我的名字是什么？我前面说过的\"})"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a71a730-215e-432a-8f58-4da84261854d",
   "metadata": {},
   "source": [
    "## ConversationTokenBufferMemory"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "c822e2b3-fa06-41c9-984b-da28cd2e94b7",
   "metadata": {},
   "outputs": [],
   "source": [
    "memory = ConversationTokenBufferMemory(llm=model, max_token_limit=200, return_messages=True)\n",
    "chain = ConversationChain(llm=model, memory=memory)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "ccded041-fee4-4c4f-9b86-9092bd95015f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input': '你好，我的名字是粒粒',\n",
       " 'history': [HumanMessage(content='你好，我的名字是粒粒'),\n",
       "  AIMessage(content=' 你好，粒粒！很高兴认识你。我是一个人工智能助手，可以回答你的问题或者聊天。有什么我可以帮你的吗？')],\n",
       " 'response': ' 你好，粒粒！很高兴认识你。我是一个人工智能助手，可以回答你的问题或者聊天。有什么我可以帮你的吗？'}"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\":\"你好，我的名字是粒粒\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "edda47ab-6006-42da-9053-e802b49f68a5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input': '我是一个程序员，你呢？',\n",
       " 'history': [HumanMessage(content='你好，我的名字是粒粒'),\n",
       "  AIMessage(content=' 你好，粒粒！很高兴认识你。我是一个人工智能助手，可以回答你的问题或者聊天。有什么我可以帮你的吗？'),\n",
       "  HumanMessage(content='我是一个程序员，你呢？'),\n",
       "  AIMessage(content='我是一个人工智能助手，专门设计来帮助回答问题和提供信息。我可以帮助你解决编程问题或者其他方面的疑惑。有什么问题可以帮你解答吗？')],\n",
       " 'response': '我是一个人工智能助手，专门设计来帮助回答问题和提供信息。我可以帮助你解决编程问题或者其他方面的疑惑。有什么问题可以帮你解答吗？'}"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\":\"我是一个程序员，你呢？\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "eabd6ba4-a787-4c51-8dc4-427af0bada80",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input': '我的名字是什么？我前面说过的',\n",
       " 'history': [AIMessage(content=' 你好，粒粒！很高兴认识你。我是一个人工智能助手，可以回答你的问题或者聊天。有什么我可以帮你的吗？'),\n",
       "  HumanMessage(content='我是一个程序员，你呢？'),\n",
       "  AIMessage(content='我是一个人工智能助手，专门设计来帮助回答问题和提供信息。我可以帮助你解决编程问题或者其他方面的疑惑。有什么问题可以帮你解答吗？'),\n",
       "  HumanMessage(content='我的名字是什么？我前面说过的'),\n",
       "  AIMessage(content='你前面说过你的名字是粒粒。')],\n",
       " 'response': '你前面说过你的名字是粒粒。'}"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.invoke({\"input\":\"我的名字是什么？我前面说过的\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9e31d032-3c38-4ac6-b46b-a45a026efce3",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
